module zl_2346_4(clk,clk_div,x);
	input   clk;  //时钟信号
	input   x; //开关信号
	output  clk_div; //分频后的时钟信号
	reg     clk_div1 = 1;
	reg     clk_div2= 1;
	reg     clk_div3= 1;
	reg     clk_div4= 1;
	
	parameter NUM_DIV1 = 21313;  //定义一个常量
	parameter NUM_DIV2 = 213129;  //定义一个常量
	reg[17:0]  cnt1 = 0; //计数器1
	reg[17:0]  cnt2 = 0; //计数器2
	reg[17:0]  cnt3 = 0; //计数器3
	reg[17:0]  cnt4 = 0; //计数器4

	//cnt1
	always @(posedge clk) //输入时钟的上升沿 复位信号的下降沿
	if (cnt1 < NUM_DIV1 - 1) //没有计满
		cnt1     <=  cnt1 + 1'b1;
	else   //计满
		cnt1 <=  18'd0;
		
	always @(posedge clk) //输入时钟的上升沿 复位信号的下降沿
	if (cnt1 < NUM_DIV1 / 2) //没有计满
		clk_div1 <= 1'b1;
	else   //计满
		clk_div1 <= 1'b0;
	
	
	//cnt2	
	always @(negedge clk) //输入时钟的上升沿 复位信号的下降沿
	if (cnt2 < NUM_DIV1 - 1) //没有计满
		cnt2 <=  cnt2 + 1'b1;
	else   //计满
		cnt2 <=  18'd0;
		
	always @(negedge clk) //输入时钟的上升沿 复位信号的下降沿
	if (cnt2 < NUM_DIV1 / 2) //没有计满
		clk_div2 <= 1'b1;
	else   //计满
		clk_div2 <= 1'b0;

	//cnt3
	always @(posedge clk ) //输入时钟的上升沿 复位信号的下降沿
	if (cnt3 < NUM_DIV2 - 1) //没有计满
		cnt3 <=  cnt3 + 1'b1;
	else   //计满
		cnt3 <=  18'd0;
	
	always @(posedge clk) //输入时钟的上升沿 复位信号的下降沿
	if (cnt3 < NUM_DIV2 / 2) //没有计满
		clk_div3 <= 1'b1;
	else   //计满
		clk_div3 <= 1'b0;
		
	//cnt4
	always @(negedge clk) //输入时钟的上升沿 复位信号的下降沿
	if (cnt4 < NUM_DIV2 - 1) //没有计满
		cnt4 <=  cnt4 + 1'b1;
	else   //计满
		cnt4 <=  18'd0;
		
	always @(negedge clk) //输入时钟的上升沿 复位信号的下降沿
	if (cnt4 < NUM_DIV2 / 2) //没有计满
		clk_div4 <= 1'b1;
	else   //计满
		clk_div4 <= 1'b0;
	
	assign clk_div = x?(clk_div1 | clk_div2):(clk_div3 | clk_div4);

endmodule 